package com.study.webapp.connectionpool;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

/**
 * 独占锁的同步器
 * @author heqiang
 *
 */
public class Mutex implements Lock {
	
	//静态内部类，自定义同步器
	private static class Sync extends AbstractQueuedSynchronizer {
		//是否处于独占状态
		protected boolean isHeidExclusively() {
			return getState() == 1;
		}
		
		//当状态为0时获取锁
		public boolean tryAcquire(int acqure) {
		    //当状态为0的时候获取锁，cas操作成功，则state状态为1
			if(compareAndSetState(0, 1)){
				setExclusiveOwnerThread(Thread.currentThread());
				return true;
			}
			return false;
		}
		//释放所，将状态设置为0
		protected boolean tryRelease (int release) {
			if(getState() == 0){
				throw new IllegalMonitorStateException();
			}
			setExclusiveOwnerThread(null);
			setState(0);
			return true;
		}
		//返回一个Condtion，每个condtion都包含一个condtion队列
		Condition newCondition(){
			return new ConditionObject();
		}
	}
	
	//仅需将操作代理到Sync上即可
	private final Sync sync = new Sync();

	@Override
	public void lock() {
		sync.acquire(1);
	}

	@Override
	public void lockInterruptibly() throws InterruptedException {
		sync.acquireInterruptibly(1);
	}

	@Override
	public boolean tryLock() {
		return sync.tryAcquire(1);
	}

	@Override
	public boolean tryLock(long time, TimeUnit unit)
			throws InterruptedException {
		return sync.tryAcquireSharedNanos(1, unit.toNanos(time));
	}

	@Override
	public void unlock() {
		sync.release(1);
	}

	@Override
	public Condition newCondition() {
		return sync.newCondition();
	}
	
	public boolean isLock(){
		return sync.isHeidExclusively();
	}
	
	public boolean hasQueuedThreads(){
		return sync.hasQueuedThreads();
	}
	
	
	
	
	
	
	
}
